package com.easystudy.media.util;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.TimeZone;

/**
 * @文件名称: DateUtil.java
 * @功能描述: TODO(日期操作工具)
 * @版权信息： www.dondown.com
 * @编写作者： lixx2048@163.com
 * @开发日期： 2020年3月26日
 * @历史版本： V1.0
 */
public class DateUtil {
	public static String MM_DD="MM月dd日";
	public static String MM_DD2="MM.dd";
	public static String YYYY_MM_DD="yyyy-MM-dd";
	public static String YYYYMMDD="yyyyMMdd";
	public static String YYYY_MM_DD_HH_MM="yyyy年MM月dd日 HH:mm";
	public static String YYYY_MM_DD_HH_MM_SS="yyyy-MM-dd HH:mm:ss";
	public static String YYYYMMDDHHMMSS="yyyyMMddHHmmss";
	public static String HH_MM_SS="HH:mm:ss";
	public static String HH_MM="HH:mm";
	public static final String YYYY_MM_DD_HH_MM_SS_SSS = "yyyy-MM-dd HH:mm:ss.SSS"; // pattern_ymdtimeMillisecond
	private static final long ONE_MINUTE = 60;
    private static final long ONE_HOUR = 3600;
    private static final long ONE_DAY = 86400;
    private static final long ONE_MONTH = 2592000;
    private static final long ONE_YEAR = 31104000;
    
	/**
	 * 取得yyyy-MM-dd HH:ss:mm格式数据
	 * @param date
	 * @return
	 */
	public static String getStringByDate(Date date,String pattern){
		SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
		return dateFormat.format(date);
	}
	/**
	 * 主要是给jfinal使用，数据库只认java.sql.*
	 * @param date
	 * @return
	 */
	public static Timestamp getSqlTimestamp(Date date){
		if(null == date){
			date = new Date();
		}
		return getSqlTimestamp(date.getTime());
	}

	/**
	 * 主要是给jfinal使用，数据库只认java.sql.*
	 * @param time
	 * @return
	 */
	public static Timestamp getSqlTimestamp(long time){
		return new java.sql.Timestamp(time);
	}
	
	/**
	 * 获取当前时间
	 * @return
	 */
	public static Date getDate(){
		return new Date();
	}

	/**
	 * 获取当前时间的时间戳
	 * @return
	 */
	public static long getTime(){
		return new Date().getTime();
	}
	
	/**
	 * @功    能: 时间转日期
	 * @作    者： lixx2048@163.com
	 * @日    期： 2020年5月16日
	 * @说    明：
	 * @历    史：lixx2048@163.com 1.0
	 */
	public static Date fromTime(long time){
		Date date = new Date();
		date.setTime(time);
		return date;
	}
	
	/**
	 * 格式化
	 * @param date
	 * @param pattern
	 * @return
	 */
	public static String format(Date date, String pattern) {
		DateFormat format = new SimpleDateFormat(pattern);
		return format.format(date);
	}
	
	/**
	 * @功能描述: TODO(获取日期+随机数字符串)
	 * @编写作者： lixx2048@163.com
	 * @开发日期： 2020年3月31日
	 * @历史版本： V1.0  
	 * @参数说明：
	 */
	public static String format(Date date, String pattern, int randomMax) {
		DateFormat format = new SimpleDateFormat(pattern);
		String rand = "" + new Random().nextInt(randomMax);
		String str = "" + randomMax;
		String last = rand;
		for(int i = rand.length(); i < str.length(); ++i) {
			last = "0" + last;
		}
		return format.format(date) + last;
	}

	/**
	 * @功    能: TODO(提供默认的日期时间格式化:yyyy-MM-dd HH:mm:ss)
	 * @作    者： lixx2048@163.com
	 * @日    期： 2019年9月19日
	 * @说    明：
	 */
	public static String format(Date date){
		DateFormat format = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		return format.format(date);
	}
	
	/**
	 * 格式化
	 * @param date
	 * @param parsePattern
	 * @param returnPattern
	 * @return
	 */
	public static String format(String date, String parsePattern, String returnPattern) {
		return format(parse(date, parsePattern), returnPattern);
	}
	
	/**
	 * 解析
	 * @param date
	 * @param pattern
	 * @return
	 */
	public static Date parse(String date, String pattern) {
		SimpleDateFormat format = new SimpleDateFormat(pattern);
		try {
			return format.parse(date);
		} catch (ParseException e) {
			System.out.println("ToolDateTime.parse异常：date值" + date + "，pattern值" + pattern);
			return null;
		}
	}

	/**
	 * 解析
	 * @param dateStr
	 * @return
	 */
	public static Date parse(String dateStr) {
		if(dateStr.trim().length() == 19){
			return parse(dateStr, DateUtil.YYYY_MM_DD_HH_MM_SS);
		}else if(dateStr.trim().length() > 19){
			return parse(dateStr, DateUtil.YYYY_MM_DD_HH_MM_SS_SSS);
		}
		return null;
	}
	
	/**
	 * 两个日期的时间差，返回"X天X小时X分X秒"
	 * 
	 * @param begin
	 * @param end
	 * @return
	 */
	public static String getBetween(Date begin, Date end) {
		long between = (end.getTime() - begin.getTime()) / 1000;// 除以1000是为了转换成秒
		long day = between / (24 * 3600);
		long hour = between % (24 * 3600) / 3600;
		long minute = between % 3600 / 60;
		long second = between % 60 / 60;

		StringBuilder sb = new StringBuilder();
		sb.append(day);
		sb.append("天");
		sb.append(hour);
		sb.append("小时");
		sb.append(minute);
		sb.append("分");
		sb.append(second);
		sb.append("秒");

		return sb.toString();
	}
	
	/**
	 * 返回两个日期之间隔了多少小时
	 * 
	 * @param date1
	 * @param end
	 * @return
	 */
	public static int getDateHourSpace(Date start, Date end) {
		int hour = (int) ((end.getTime() - start.getTime()) /3600/ 1000);
		return hour;
	}
	
	/**
	 * 返回两个日期之间隔了多少秒
	 * 
	 * @param date1
	 * @param end
	 * @return
	 */
	public static int getDateSecSpace(Date start, Date end) {
		int sen = (int) ((end.getTime() - start.getTime()) / 1000);
		return sen;
	}
	
	/**
	 * 返回两个日期之间隔了多少天
	 * 
	 * @param date1
	 * @param end
	 * @return
	 */
	public static int getDateDaySpace(Date start, Date end) {
		int day = getDateHourSpace(start, end) / 24;
		return day;
	}
	
	/**
	 * 得到某一天是星期几
	 * @param strDate 日期字符串
	 * @return String 星期几
	 */
	public static String getDateInWeek(Date date) {
		String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));  
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		calendar.setTime(date);
		int dayIndex = calendar.get(Calendar.DAY_OF_WEEK) - Calendar.SUNDAY;
		if (dayIndex < 0){
			dayIndex = 0;
		}
		return weekDays[dayIndex];
	}
	
	/**
	 * 日期减去多少个小时
	 * @param date
	 * @param hourCount	多少个小时
	 * @return
	 */
	public static Date getDateReduceHour(Date date, long hourCount){
		long time = date.getTime() - 3600 * 1000 * hourCount;
		Date dateTemp = new Date();
		dateTemp.setTime(time);
		return dateTemp;
	}
	
	/**
	 * 日期区间分割
	 * @param start
	 * @param end
	 * @param splitCount
	 * @return
	 */
	public static List<Date> getDateSplit(Date start, Date end, long splitCount){
		long startTime = start.getTime();
		long endTime = end.getTime();
		long between = endTime - startTime;

		long count = splitCount - 1l;
		long section = between / count;
		
		List<Date> list = new ArrayList<Date>();
		list.add(start);
		
		for (long i = 1l ; i < count; i++) {
			long time = startTime + section * i;
			Date date = new Date();
			date.setTime(time);
			list.add(date);
		}
		
		list.add(end);
		
		return list;
	}
	
	/**
	 * 返回两个日期之间隔了多少天，包含开始、结束时间
	 * @param start
	 * @param end
	 * @return
	 */
	public static List<String> getDaySpaceDate(Date start, Date end) {
		Calendar fromCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		fromCalendar.setTime(start);
		fromCalendar.set(Calendar.HOUR_OF_DAY, 0);
		fromCalendar.set(Calendar.MINUTE, 0);
		fromCalendar.set(Calendar.SECOND, 0);
		fromCalendar.set(Calendar.MILLISECOND, 0);

		Calendar toCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		toCalendar.setTime(end);
		toCalendar.set(Calendar.HOUR_OF_DAY, 0);
		toCalendar.set(Calendar.MINUTE, 0);
		toCalendar.set(Calendar.SECOND, 0);
		toCalendar.set(Calendar.MILLISECOND, 0);

		List<String> dateList = new LinkedList<String>();

		long dayCount = (toCalendar.getTime().getTime() - fromCalendar.getTime().getTime()) / (1000 * 60 * 60 * 24);
		if(dayCount < 0){
			return dateList;
		}

		dateList.add(format(fromCalendar.getTime(), YYYY_MM_DD));
		
		for (int i = 0; i < dayCount; i++) {
			fromCalendar.add(Calendar.DATE, 1);// 增加一天
			dateList.add(format(fromCalendar.getTime(), YYYY_MM_DD));
		}

		return dateList;
	}
	
	/**
	 * @功能描述: 检测时间日期是否在时间段中
	 * @编写作者： lixx2048@163.com
	 * @开发日期： 2021年5月9日
	 * @历史版本： V1.0  
	 * @参数说明：
	 * @返  回  值：
	 */
	public static boolean between(Date current, Date start, Date stop) {
		return current.getTime() >= start.getTime() && current.getTime() <= stop.getTime();
	}
	
	/**
	 * @功能描述: 检测时间时间是否在时间段中
	 * @编写作者： lixx2048@163.com
	 * @开发日期： 2021年5月9日
	 * @历史版本： V1.0  
	 * @参数说明：只检测时间范围
	 * @返  回  值：
	 */
	public static boolean timeBetween(Date current, Date start, Date stop) {
		Calendar fromCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		
		fromCalendar.setTime(current);
		long cur_hour = fromCalendar.get(Calendar.HOUR);
		long cur_minute = fromCalendar.get(Calendar.MINUTE);
		long cur_second = fromCalendar.get(Calendar.SECOND);
		long cur_time = cur_hour*3600 + cur_minute*60 + cur_second;
		
		fromCalendar.setTime(start);
		long start_hour = fromCalendar.get(Calendar.HOUR);
		long start_minute = fromCalendar.get(Calendar.MINUTE);
		long start_second = fromCalendar.get(Calendar.SECOND);
		long start_time = start_hour*3600 + start_minute*60 + start_second;
		
		fromCalendar.setTime(stop);
		long stop_hour = fromCalendar.get(Calendar.HOUR);
		long stop_minute = fromCalendar.get(Calendar.MINUTE);
		long stop_second = fromCalendar.get(Calendar.SECOND);
		long stop_time = stop_hour*3600 + stop_minute*60 + stop_second;
		
		return cur_time >= start_time && cur_time <= stop_time;
	}
	
	/**
	 * @功能描述: 时分秒化作秒为单位方便比较
	 * @编写作者： lixx2048@163.com
	 * @开发日期： 2021年5月9日
	 * @历史版本： V1.0  
	 * @参数说明：
	 * @返  回  值：
	 */
	public static long getTimeSeconds(Date time) {
		Calendar fromCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		fromCalendar.setTime(time);
		long cur_hour = fromCalendar.get(Calendar.HOUR);
		long cur_minute = fromCalendar.get(Calendar.MINUTE);
		long cur_second = fromCalendar.get(Calendar.SECOND);
		return cur_hour*3600 + cur_minute*60 + cur_second;
	}
	
	/**
	 * @功能描述: 获取年份
	 * @编写作者： lixx2048@163.com
	 * @开发日期： 2021年5月9日
	 * @历史版本： V1.0  
	 * @参数说明：
	 * @返  回  值：
	 */
	public static long getYear(Date time) {
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		calendar.setTime(time);
		return calendar.get(Calendar.YEAR);
	}
	
	/**
	 * @功能描述: 获取月份
	 * @编写作者： lixx2048@163.com
	 * @开发日期： 2021年5月9日
	 * @历史版本： V1.0  
	 * @参数说明：
	 * @返  回  值：
	 */
	public static long getMonth(Date time) {
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		calendar.setTime(time);
		return calendar.get(Calendar.MONTH);
	}
	
	/**
	 * @功能描述: 获取月份
	 * @编写作者： lixx2048@163.com
	 * @开发日期： 2021年5月9日
	 * @历史版本： V1.0  
	 * @参数说明：
	 * @返  回  值：
	 */
	public static long getDay(Date time) {
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		calendar.setTime(time);
		return calendar.get(Calendar.DAY_OF_MONTH);
	}
	
	/**
	 * @功能描述: 获取小时
	 * @编写作者： lixx2048@163.com
	 * @开发日期： 2021年5月9日
	 * @历史版本： V1.0  
	 * @参数说明：
	 * @返  回  值：
	 */
	public static long getHour(Date time) {
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		calendar.setTime(time);
		return calendar.get(Calendar.HOUR_OF_DAY);
	}
	
	/**
	 * @功能描述: 获取分钟
	 * @编写作者： lixx2048@163.com
	 * @开发日期： 2021年5月9日
	 * @历史版本： V1.0  
	 * @参数说明：
	 * @返  回  值：
	 */
	public static long getMinute(Date time) {
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		calendar.setTime(time);
		return calendar.get(Calendar.MINUTE);
	}
	
	/**
	 * @功能描述: 获取秒
	 * @编写作者： lixx2048@163.com
	 * @开发日期： 2021年5月9日
	 * @历史版本： V1.0  
	 * @参数说明：
	 * @返  回  值：
	 */
	public static long getSecond(Date time) {
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		calendar.setTime(time);
		return calendar.get(Calendar.SECOND);
	}
	
	/**
	 * @功能描述: 获取毫秒
	 * @编写作者： lixx2048@163.com
	 * @开发日期： 2021年5月9日
	 * @历史版本： V1.0  
	 * @参数说明：
	 * @返  回  值：
	 */
	public static long getMilliSecond(Date time) {
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		calendar.setTime(time);
		return calendar.get(Calendar.MILLISECOND);
	}
	
	/**
	 * 获取开始时间
	 * @param start
	 * @param end
	 * @return
	 */
	public static Date startDateByDay(Date start, int end){
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));  
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		calendar.setTime(start);
		calendar.add(Calendar.DATE, end);// 明天1，昨天-1
		calendar.set(Calendar.HOUR_OF_DAY, 0);   
		calendar.set(Calendar.MINUTE, 0);   
		calendar.set(Calendar.SECOND, 0);   
		calendar.set(Calendar.MILLISECOND, 0);   
		Date date = calendar.getTime();
		return date;
	}
	
	/**
	 * 获取结束时间
	 * @param start
	 * @param end
	 * @return
	 */
	public static Date endDateByDay(Date start){
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));  
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		calendar.setTime(start);
		calendar.set(Calendar.HOUR_OF_DAY, 23);   
		calendar.set(Calendar.MINUTE, 59);   
		calendar.set(Calendar.SECOND, 59);   
		calendar.set(Calendar.MILLISECOND, 999);   
		Date date = calendar.getTime();
		return date;
	}

	/**
	 * 获取开始时间
	 * @param start
	 * @param end
	 * @return
	 */
	public static Date startDateByHour(Date start, int end){
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));  
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		calendar.setTime(start); 
		calendar.set(Calendar.MINUTE, end);   
		Date date = calendar.getTime();
		return date;
	}
	
	/**
	 * 获取结束时间
	 * @param start
	 * @param end
	 * @return
	 */
	public static Date endDateByHour(Date end){
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));  
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		calendar.setTime(end); 
		calendar.set(Calendar.SECOND, 59);   
		calendar.set(Calendar.MILLISECOND, 999);   
		Date date = calendar.getTime();
		return date;
	}
	
	/**
	 * 根据年份和周得到周的开始和结束日期
	 * @param year
	 * @param week
	 * @return
	 */
	public static Map<String, Date> getStartEndDateByWeek(int year, int week){
		Calendar weekCalendar = new GregorianCalendar();
		weekCalendar.set(Calendar.YEAR, year);
		weekCalendar.set(Calendar.WEEK_OF_YEAR, week);
		weekCalendar.set(Calendar.DAY_OF_WEEK, weekCalendar.getFirstDayOfWeek());
		
		Date startDate = weekCalendar.getTime(); // 得到周的开始日期

		weekCalendar.roll(Calendar.DAY_OF_WEEK, 6);
		Date endDate = weekCalendar.getTime(); // 得到周的结束日期
		
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));  
		
		// 开始日期往前推一天
		Calendar startCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		startCalendar.setTime(startDate);
		startCalendar.add(Calendar.DATE, 1);// 明天1，昨天-1
		startCalendar.set(Calendar.HOUR_OF_DAY, 0);   
		startCalendar.set(Calendar.MINUTE, 0);   
		startCalendar.set(Calendar.SECOND, 0);   
		startCalendar.set(Calendar.MILLISECOND, 0);   
		startDate = startCalendar.getTime();

		// 结束日期往前推一天
		Calendar endCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		endCalendar.setTime(endDate);
		endCalendar.add(Calendar.DATE, 1);// 明天1，昨天-1
		endCalendar.set(Calendar.HOUR_OF_DAY, 23);   
		endCalendar.set(Calendar.MINUTE, 59);   
		endCalendar.set(Calendar.SECOND, 59);   
		endCalendar.set(Calendar.MILLISECOND, 999);   
		endDate = endCalendar.getTime();
		
		Map<String, Date> map = new HashMap<String, Date>();
		map.put("start", startDate);
		map.put("end", endDate);
		return map;
	}
	
	/**
	 * 根据日期月份，获取月份的开始和结束日期
	 * @param date
	 * @return
	 */
	public static Map<String, Date> getMonthDate(Date date){
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));  
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		calendar.setTime(date);
		calendar.set(Calendar.HOUR_OF_DAY, 0);   
		calendar.set(Calendar.MINUTE, 0);   
		calendar.set(Calendar.SECOND, 0);   
		calendar.set(Calendar.MILLISECOND, 0);
		
		// 得到前一个月的第一天
		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
		Date start = calendar.getTime();
		
		// 得到前一个月的最后一天
		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
		Date end = calendar.getTime();
		
		Map<String, Date> map = new HashMap<String, Date>();
		map.put("start", start);
		map.put("end", end);
		return map;
	}
	
	/**
	 * @功能描述: 获取时间
	 * @编写作者： lixx2048@163.com
	 * @开发日期： 2020年4月10日
	 * @历史版本： V1.0  
	 * @参数说明：
	 */
	public static Date getDate(int year, int month, int day, int hour, int minute, int second) {
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));  
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		calendar.set(Calendar.YEAR, year);   
		calendar.set(Calendar.MONTH, month);   
		calendar.set(Calendar.DAY_OF_MONTH, day);   
		calendar.set(Calendar.HOUR_OF_DAY, hour);   
		calendar.set(Calendar.MINUTE, minute);   
		calendar.set(Calendar.SECOND, second);   
		calendar.set(Calendar.MILLISECOND, 0);
		return calendar.getTime();
	}
	
	/**
	 *  格式化输出日期对象
	 * @param time
	 * @return
	 */
	public static String format(Timestamp time,String formatStr)
	{
		if(time==null)return "";
		return new SimpleDateFormat(formatStr).format(time);
	}
	
	/**
	 * @功    能: TODO(提供默认的日期时间格式化:yyyy-MM-dd HH:mm:ss)
	 * @作    者： lixx2048@163.com
	 * @日    期： 2019年9月19日
	 * @说    明：
	 */
	public static String format(Timestamp time)
	{
		if(time==null)return "";
		return new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS).format(time);
	}

	/**
	 * 获取指定日期
	 * @param date
	 * @param hour
	 * @param minute
	 * @param second
	 * @param millisecond
	 * @return
	 */
	public static Date getDate(int date, int hour, int minute, int second, int millisecond) {
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));  
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		calendar.add(Calendar.DATE, date); 
		calendar.set(Calendar.HOUR_OF_DAY, hour);   
		calendar.set(Calendar.MINUTE, minute);   
		calendar.set(Calendar.SECOND, second);   
		calendar.set(Calendar.MILLISECOND, millisecond);  
		return calendar.getTime();
	}
	
	/**
     * 距离今天多久
     * @param date
     * @return 
     * 
     */
    public static String fromToday(String datetime) {
    	Date date = new Date();
    	try {
			SimpleDateFormat simple = new SimpleDateFormat(
					"yyyy-MM-dd HH:mm:ss");
			date = simple.parse(datetime);
		} catch (ParseException e) {
			return "";
		}
    	
    	TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));  
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
        calendar.setTime(date);
 
        long time = date.getTime() / 1000;
        long now = new Date().getTime() / 1000;
        long ago = now - time;
        if(ago <= ONE_MINUTE){
        	return "刚刚";
        }else if (ago <= ONE_HOUR)
            return ago / ONE_MINUTE + "分钟前";
        else if (ago <= ONE_DAY)
            return ago / ONE_HOUR + "小时" + (ago % ONE_HOUR / ONE_MINUTE)
                    + "分钟前";
        else if (ago <= ONE_DAY * 2)
            return "昨天";// + calendar.get(Calendar.HOUR_OF_DAY) + "点";
                   // + calendar.get(Calendar.MINUTE) + "分";
        else if (ago <= ONE_DAY * 3)
            return "前天";// + calendar.get(Calendar.HOUR_OF_DAY) + "点";
                    //+ calendar.get(Calendar.MINUTE) + "分";
        else if (ago <= ONE_MONTH) {
            long day = ago / ONE_DAY;
            return day + "天前";// + calendar.get(Calendar.HOUR_OF_DAY) + "点";
                    //+ calendar.get(Calendar.MINUTE) + "分";
        } else if (ago <= ONE_YEAR) {
            long month = ago / ONE_MONTH;
            long day = ago % ONE_MONTH / ONE_DAY;
            return month + "个月" + day + "天前";
                    //+ calendar.get(Calendar.HOUR_OF_DAY) + "点"
                   // + calendar.get(Calendar.MINUTE) + "分";
        } else {
            long year = ago / ONE_YEAR;
            int month = calendar.get(Calendar.MONTH) + 1;// JANUARY which is 0 so month+1
            return year + "年前" + month + "月" + calendar.get(Calendar.DATE)
                    + "日";
        }
 
    }
    
    /**
	 * 日期增加n天（如果为减去多少天则gap为负值即可）
	 * @param s
	 * @param e
	 * @return
	 */
	public static Date addDay(Date date, Integer gap){
		Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		c.setTime(date);
		c.add(Calendar.DAY_OF_MONTH, gap);
		return c.getTime();
	}

    /**
	 * 日期增加n小时（如果为减去多少小时则gap为负值即可）
	 * @param s
	 * @param e
	 * @return
	 */
	public static Date addHour(Date date, Integer gap){
		Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		c.setTime(date);
		c.add(Calendar.HOUR_OF_DAY, gap);
		return c.getTime();
	}

	/**
	 * 日期增加n秒（如果为减去多少s则gap为负值即可）
	 * @param date
	 * @param gap
	 * @return
	 */
	public static Date addSecond(Date date, Integer gap){
		Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		c.setTime(date);
		c.add(Calendar.SECOND, gap);
		return c.getTime();
	}
	
	/**
	 * 判断日期间隔是否存在交集
	 * @param date
	 * @param gap
	 * @return
	 */
	public static Boolean isDateIntersection(Date startDateOne,Date endDateOne,Date startDateTwo,Date endDateTwo){
        Date maxStartDate = startDateOne;
        if(maxStartDate.before(startDateTwo)){
            maxStartDate = startDateTwo;
        }

        Date minEndDate = endDateOne;
        if(endDateTwo.before(minEndDate)){
            minEndDate = endDateTwo;
        }
        if(maxStartDate.before(minEndDate) /*|| (maxStartDate.getTime() == minEndDate.getTime())*/){
            return true;
        }else {
            return  false;
        }
    }
	
	/**
	 * 判断时间间隔是否存在交集
	 * @param date
	 * @param gap
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public static Boolean isTimeIntersection(Date startDateOne,Date endDateOne,Date startDateTwo,Date endDateTwo){
		startDateOne.setYear(2021);
		startDateOne.setMonth(1);
		startDateOne.setDate(1);
		endDateOne.setYear(2021);
		endDateOne.setMonth(1);
		endDateOne.setDate(1);
		startDateTwo.setYear(2021);
		startDateTwo.setMonth(1);
		startDateTwo.setDate(1);
		endDateTwo.setYear(2021);
		endDateTwo.setMonth(1);
		endDateTwo.setDate(1);
		Date maxStartDate = startDateOne;
        if(maxStartDate.before(startDateTwo)){
            maxStartDate = startDateTwo;
        }

        Date minEndDate = endDateOne;
        if(endDateTwo.before(minEndDate)){
            minEndDate = endDateTwo;
        }
        if(maxStartDate.before(minEndDate) /*|| (maxStartDate.getTime() == minEndDate.getTime())*/){
            return true;
        }else {
            return  false;
        }
    }
}
